/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package SintaticoPacote;

import SintaticoPacote.TratamentoErro.ErroTabela;
import SintaticoPacote.TratamentoErro.TabelaErros;
import compilador_full.TabelaSimbolos;

/**
 *
 * @author Fernanda
 */
public class CmdWhile {

    ExpLogicaBoolean expLogBool = new ExpLogicaBoolean();
    cmd cmd = new cmd();

    /**
     * Método para verificar sintaxe do comando while
     * @param tabelasimbolos
     * @return true, se a sintaxe estiver correta
     */
    public boolean sintaxeWhile(TabelaSimbolos tabelasimbolos) {

        tabelasimbolos.insertEscopo();
        if (tabelasimbolos.reconhecer("while") && tabelasimbolos.reconhecer("(") && verificaExpOrBool(tabelasimbolos)
                && tabelasimbolos.reconhecer(")")) {

            if (tabelasimbolos.getLookahead().equals("{")) {
                if (tabelasimbolos.reconhecer("{")) {
                    System.out.println(" RECONHECEU {");
                    while (verificaInicioCmd(tabelasimbolos)) {
                        System.out.println(" PASSOU COMANDO");
                        if (cmd.sintaxeCmd(tabelasimbolos)) {
                            continue;
                        }
                    }
                    if (tabelasimbolos.reconhecer("}"))//permite {} sem comando dentro
                    {
                        System.out.println(" RECONHECEU }");
                        return true;
                    } else {

                         ErroTabela erro = new ErroTabela(tabelasimbolos.getLinha(), "Erro na linha " + tabelasimbolos.getLinha() + " } esperado");
                         TabelaErros.getInstance().getTabelaErros().add(erro);// Tabela de Erros ja contem o erro. Isso que será impresso na tela.
                        return false; //se nao achar }
                    }

                }
            } else if (verificaInicioCmd(tabelasimbolos)) {

                System.out.println(" reconheceu comando sem chave");
                //quando o while só tem um comando (nao tem chaves)
                if (cmd.sintaxeCmd(tabelasimbolos)) {
                    return true;
                } else {

                     ErroTabela erro = new ErroTabela(tabelasimbolos.getLinha(), "Erro na linha " + tabelasimbolos.getLinha() + " comando mal formado");
                     TabelaErros.getInstance().getTabelaErros().add(erro);// Tabela de Erros ja contem o erro. Isso que será impresso na tela.
                    return false; //erro devido comando mal formado
                }
            }
            else{
                 ErroTabela erro = new ErroTabela(tabelasimbolos.getLinha(), "Erro na linha " + tabelasimbolos.getLinha() + " ou nao existe{ ou nao existe um inicio de um comando");
                         TabelaErros.getInstance().getTabelaErros().add(erro);// Tabela de Erros ja contem o erro. Isso que será impresso na tela.
                         return false; // se nao existir nem {, nem inicio de um comando. Ex: while(true)}
            }
                


            return true;

        } else {

             ErroTabela erro = new ErroTabela(tabelasimbolos.getLinha(), "Erro na linha " + tabelasimbolos.getLinha() + " Não seguiu a sintaxe : while(exp ou boolean){");
                         TabelaErros.getInstance().getTabelaErros().add(erro);// Tabela de Erros ja contem o erro. Isso que será impresso na tela.
            return false;//se nao achar a cadeia while(exp|boolean){, a sintaxe esta errada
        }
    }

    /**
     * Verifica se há comando(s) dentro do while
     * @param tabelasimbolos
     * @return true, se há comando dentro do while
     */
    public boolean verificaInicioCmd(TabelaSimbolos tabelasimbolos) {
        if (tabelasimbolos.getTipo().equals("identificador") || tabelasimbolos.getLookahead().equals("*") ||
                tabelasimbolos.getLookahead().equals("scanf") || tabelasimbolos.getLookahead().equals("printf") ||
                tabelasimbolos.getLookahead().equals("if") || tabelasimbolos.getLookahead().equals("while") ||
                tabelasimbolos.getLookahead().equals("do") || tabelasimbolos.getLookahead().equals("for")) {
            return true;
        }

        return false;
    }

    public boolean verificaExpOrBool(TabelaSimbolos tabelasimbolos){

        if(verificaExpLogica(tabelasimbolos)){
            if(ExpressaoLogica.expLogica(tabelasimbolos) ){
                return true;
        }
            else{

                         return false;//expLogica mal formada
            }
                
        }
            
        else if(tabelasimbolos.getLookahead().equals("true")
                ||tabelasimbolos.getLookahead().equals("false")){
            System.out.println(" Foi um boolean ");
            tabelasimbolos.soConsome();
            return true;
        }
        else{
            
                         return false; //sintaxe errada, se nao existir expLogica ou um boolean
        }
            
    }

        public boolean verificaExpLogica(TabelaSimbolos tabelaSimbolos) {

        if (tabelaSimbolos.getTipo().equals("identificador") || tabelaSimbolos.getTipo().equals("numero") ||
                tabelaSimbolos.getLookahead().equals("(")) {
            return true;
        } else {
            return false;
        }
        }

}
